﻿#pragma once
#include "define.h"
#include <string>
#include <fstream>
#include <iostream>

#if defined(MACOS)
#include <unistd.h>
#elif defined(WINDOWS)
#include <direct.h>
#endif

using namespace std;
class lineEndChanger
{
public:
	/*状态列表*************/
	const static int STA_START 	= 1;		//程序开始状态
	const static int STA_INIT 	= 2;		//初始化状态
	const static int STA_CONV	= 3;		//转化状态
	const static int STA_SELE 	= 4;		//选择状态
	const static int STA_DONE 	= 5;		//完成状态
	const static int STA_QUIT 	= 6;		//退出状态
	const static int STA_ERR 	= -1;		//出错状态
	const static int STA_OVER 	= -2;		//完结状态
	const static int STA_UNDF 	= -3;		//未定义状态
	/*状态列表*************/

	/*转化对象*************/
	const static int SYS_MAC 		= 1;			//<CR>      : /r
	const static int SYS_WINDOWS 	= 2;			//<CR><LF>  : /r/n
	const static int SYS_UNIX 		= 3;			//<LF>      : /n
	const static int SYS_NONE 		= -1;
	/*转化对象*************/

	/*换行符常量***********/
	const static char* LINE_FEED_MAC;
	const static char* LINE_FEED_WIN;
	const static char* LINE_FEED_UNIX;
	/*换行符常量***********/

	/*错误信息*************/
	const static string ERR_PARAMETER;		//直接调用参数错误
	const static string ERR_IN_FILE;		//输入文件错误
	const static string ERR_OUT_FILE;		//输出文件错误
	const static string ERR_SYS_PARA;		//目标类型参数错误
	/*错误信息*************/

	/*输出信息*************/
	const static string INFO_START;			//程序开始信息
	const static string INFO_INIT;			//初始化信息
	const static string INFO_CONV;			//输出文件错误
	const static string INFO_SELE;			//选择状态信息
	const static string INFO_DONE;			//完成状态信息
	const static string INFO_QUIT;			//退出状态信息
	const static string INFO_OVER;			//完结状态信息
	const static string INFO_PARA;			//参数表信息
	/*输出信息*************/

	lineEndChanger(void):
		status(STA_START),
		lastStatus(STA_UNDF),
		isByCMD(false),
		inOutFlag(false),
		overWriteFlag(false),
		outType(SYS_NONE),
		errStr(string("")),
		fileNameIn(string("")),
		fileNameOut(string("")){};
	~lineEndChanger(void);

	bool isByCMD;					//是否由控制台参数模式打开
	string fileNameIn;				//输入文件名
	string fileNameOut;				//输出文件名
	string errStr;					//错误信息
	ifstream fileIn;				//读入的文件
	ofstream fileOut;				//输出的文件
	fstream fileInOut;				//读写文件（适用于转换自己）
	int outType;					//需要转换成的格式
	bool inOutFlag;					//是否是同一个文件
	bool overWriteFlag;				//覆盖是否提示

	bool fileInLoad();				//打开读入文件
	bool fileOutLoad();				//打开输出文件
	bool fileInOutLoad();			//打开读写文件（输出和输入是一个文件）
	void clearErr();				//清空错误信息
	void printInfo();				//输出信息

	bool lecStart(int,char**);		//程序启动
	bool lecInit();					//初始化文件和导出类型
	bool lecSelect();				//选择类型和文件
	bool lecConvert();				//转换文件
	bool lecDone();					//完成状态处理
	bool lecErrHandle();			//错误状态处理

	string& convertToMac(string&);	//转为mac格式
	string& convertToWin(string&);	//转为win格式
	string& convertToUnx(string&);	//转为unix格式

	int getStatus();				//获取当前状态
	int getLastStatus();			//获取上次状态
	int setStatus(int);				//设定当前状态
private:
	int status;						//当前状态
	int lastStatus;					//上次状态


};

